package com.demo.main.utils;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class ReflectionUtil {

    private ReflectionUtil() {
        throw new IllegalStateException("Utility class");
    }

    /**
     * 创建指定类的实例并设置指定字段的值。
     *
     * @param <T>        要创建的对象类型
     * @param fieldName  要设置的字段名
     * @param fieldValue 要设置的字段值
     * @param clazz      要创建的对象的类
     * @return 创建并设置了字段值的对象实例，如果创建或设置失败则返回null
     * @throws RuntimeException 如果在创建对象或设置字段值时发生异常
     */
    public static <T> T createAndSetField(String fieldName, Object fieldValue, Class<T> clazz) {
        T obj = null;
        try {
            Constructor<T> constructor = clazz.getDeclaredConstructor();
            constructor.setAccessible(true);
            obj = constructor.newInstance();

            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(obj, fieldValue);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return obj;
    }

    /**
     * 检查给定对象是否有任何非null字段。
     *
     * @param obj 要检查的对象
     * @return 如果对象有至少一个非null字段则返回true，否则返回false
     */
    public static boolean hasNonNullField(Object obj) {
        if (obj == null) {
            return false;
        }

        Class<?> clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            field.setAccessible(true);
            try {
                if (field.get(obj) != null) {
                    return true;
                }
            } catch (IllegalAccessException ignored) {
            }
        }

        return false;
    }
}
